// json_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <iostream>
#include "nlohmann/json.hpp"    // https://github.com/nlohmann/json/tree/develop/single_include/nlohmann/json.hpp
#include <fstream>              // ifstream, ofstream
#include <iomanip>              // std::setw()

using json = nlohmann::json;

void read()
{
	// 从文件读取配置
	std::ifstream fin("sipconfig.json");   // 注意此处是相对路径
	json data;
	fin >> data;
	fin.close();

	// 解析config_35114
	printf("config_35114:\n");
	printf("en_uas_id: %s\n", data["config_35114"]["en_uas_id"].get<std::string>().c_str());
	printf("en_uas_domain: %s\n", data["config_35114"]["en_uas_domain"].get<std::string>().c_str());
	printf("en_uas_ip: %s\n", data["config_35114"]["en_uas_ip"].get<std::string>().c_str());
	printf("en_uas_port: %s\n", data["config_35114"]["en_uas_port"].get<std::string>().c_str());
	printf("en_uas_pswd: %s\n", data["config_35114"]["en_uas_pswd"].get<std::string>().c_str());
	printf("uas_id: %s\n", data["config_35114"]["uas_id"].get<std::string>().c_str());
	printf("uas_domain: %s\n", data["config_35114"]["uas_domain"].get<std::string>().c_str());
	printf("uas_ip: %s\n", data["config_35114"]["uas_ip"].get<std::string>().c_str());
	printf("uas_port: %s\n", data["config_35114"]["uas_port"].get<std::string>().c_str());
	printf("uas_pswd: %s\n", data["config_35114"]["uas_pswd"].get<std::string>().c_str());
	printf("uac_id: %s\n", data["config_35114"]["uac_id"].get<std::string>().c_str());
	printf("uac_domain: %s\n", data["config_35114"]["uac_domain"].get<std::string>().c_str());
	printf("reg_ip: %s\n", data["config_35114"]["reg_ip"].get<std::string>().c_str());
	printf("reg_port: %s\n", data["config_35114"]["reg_port"].get<std::string>().c_str());
	printf("uac_port: %s\n", data["config_35114"]["uac_port"].get<std::string>().c_str());
	printf("sign: %s\n", data["config_35114"]["sign"].get<std::string>().c_str());
	printf("type: %s\n", data["config_35114"]["type"].get<std::string>().c_str());

	// 解析config_28181
	printf("\nconfig_28181:\n");
	printf("en_uas_id: %s\n", data["config_28181"]["en_uas_id"].get<std::string>().c_str());
	printf("en_uas_domain: %s\n", data["config_28181"]["en_uas_domain"].get<std::string>().c_str());
	printf("en_uas_ip: %s\n", data["config_28181"]["en_uas_ip"].get<std::string>().c_str());
	printf("en_uas_port: %s\n", data["config_28181"]["en_uas_port"].get<std::string>().c_str());
	printf("en_uas_pswd: %s\n", data["config_28181"]["en_uas_pswd"].get<std::string>().c_str());
	printf("uas_id: %s\n", data["config_28181"]["uas_id"].get<std::string>().c_str());
	printf("uas_domain: %s\n", data["config_28181"]["uas_domain"].get<std::string>().c_str());
	printf("uas_ip: %s\n", data["config_28181"]["uas_ip"].get<std::string>().c_str());
	printf("uas_port: %s\n", data["config_28181"]["uas_port"].get<std::string>().c_str());
	printf("uas_pswd: %s\n", data["config_28181"]["uas_pswd"].get<std::string>().c_str());
	printf("uac_id: %s\n", data["config_28181"]["uac_id"].get<std::string>().c_str());
	printf("uac_domain: %s\n", data["config_28181"]["uac_domain"].get<std::string>().c_str());
	printf("reg_ip: %s\n", data["config_28181"]["reg_ip"].get<std::string>().c_str());
	printf("reg_port: %s\n", data["config_28181"]["reg_port"].get<std::string>().c_str());
	printf("uac_port: %s\n", data["config_28181"]["uac_port"].get<std::string>().c_str());
	printf("sign: %s\n", data["config_28181"]["sign"].get<std::string>().c_str());
	printf("type: %s\n", data["config_28181"]["type"].get<std::string>().c_str());

	// 解析config_device
	printf("\nconfig_device:\n");
	for (const auto& device : data["config_device"]) {
		printf("name: %s\n", device["name"].get<std::string>().c_str());
		printf("ID: %s\n", device["ID"].get<std::string>().c_str());
		printf("domain: %s\n", device["domain"].get<std::string>().c_str());
		printf("IP: %s\n", device["IP"].get<std::string>().c_str());
		printf("port: %s\n", device["port"].get<std::string>().c_str());
		printf("\n");
	}

	// 检查读取的和预期的是否一致
	std::cout << data["config_35114"] << std::endl;	// 3.141
	std::cout << data["config_28181"] << std::endl;	// true
	std::cout << data["config_device"] << std::endl;	// "Niels"
	//std::cout << data["nothing"] << std::endl;	// null
	//std::cout << data["answer"]["everything"] << std::endl;	// 42
	//std::cout << data["list"] << std::endl;	// [1, 0, 2]
	//std::cout << data["object"] << std::endl;	// { "currency":"USD","value" : 42.99 }

	// 写入文件
	std::ofstream fout("object.json");  // 注意 object.json 和 config.json 内容一致，但是顺序不同
	fout << std::setw(4) << data << std::endl;
	fout.close();

	// 注意：
	// JSON标准将对象定义为“零个或多个名称 / 值对的无序集合”。
	// 如果希望保留插入顺序，可以使用tsl::ordered_map(integration)或nlohmann::fifo_map(integration)等容器专门化对象类型。
}

void update()
{
	// 读取 JSON 文件
	std::ifstream inFile("sipconfig.json");
	if (!inFile.is_open()) {
		std::cerr << "Could not open the file!" << std::endl;
		return;
	}

	json j;
	inFile >> j;
	inFile.close();

	// 输出原始 JSON 内容
	std::cout << "Original JSON content:\n" << j.dump(4) << std::endl;

	// 修改 JSON 值
	j["config_28181"]["en_uas_ip"] = "192.168.0.100";

	for (auto& device : j["config_device"]) {
		if (device["ID"] == "199") {
			device["IP"] = "192.48.0.200";
		}
	}

	// 输出修改后的 JSON 内容
	std::cout << "Modified JSON content:\n" << j.dump(4) << std::endl;

	// 将修改后的 JSON 写回文件
	std::ofstream outFile("object.json");
	if (!outFile.is_open()) {
		std::cerr << "Could not open the file for writing!" << std::endl;
		return;
	}

	outFile << j.dump(4);  // 格式化输出，缩进4个空格
	outFile.close();
}

int main()
{
	//read();
	update();
	getchar();
}
